package com.fastdfs.util;

import com.fastdfs.pojo.Imageitems;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import org.junit.Test;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


/**
 <dependency>
 <groupId>com.google.code.gson</groupId>
 <artifactId>gson</artifactId>
 <version>2.8.6</version>
 </dependency>
 */


// 特别注意 :   json 转换为 list 常规字符串操作没什么问题  但是 如果 list 里的数据强制转换成实体类的话那么就会报错
//java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to
//解决办法就是指定转换对象   下面 List 给出了 不是泛型的  可以修改的模板

public class JsonTurnUtils<T> {

   private final static Gson gson = new Gson();
    //把json 字符串 转换为 Map
    public static Map<String, Object> jsonTurnMap(String json){
        Map<String, Object> res = null;
        try {
            res = gson.fromJson(json, new TypeToken<Map<String, Object>>() {
            }.getType());

        } catch (JsonSyntaxException e) {
        }
        return res;
    }



    // 把JSOn 字符串 转实体类 泛型版
    public static <T>T jsonTurnJavaBena(String json, Class clazz){
       T res = null;
        try {
            res =  (T)gson.fromJson(json,clazz);
        } catch (JsonSyntaxException e) {
        }
        return res;
    }


    //json字符串转化为list集合

    public static  <T> List<T> jsonTurnList(String json,Class clazz) {
        Type type = new ParameterizedTypeImpl(clazz);
        List<T> list =  gson.fromJson(json, type);
        return list;
    }

    //把json 字符串 转换为 LIst  指定转换对象 (模板 自行修改要转换的实体类    Result<Imageitems> 替换  )
    public static    List<Result<Imageitems>>  jsonTurnList_Custom(String json){
        List<Result<Imageitems>> res = null;
        try {
            res = gson.fromJson(json, new TypeToken<ArrayList<Result<Imageitems>>>() {
            }.getType());

        } catch (JsonSyntaxException e) {
        }
        return res;
    }


    private static class ParameterizedTypeImpl implements ParameterizedType {
        Class clazz;

        public ParameterizedTypeImpl(Class clz) {
            clazz = clz;
        }

        @Override
        public Type[] getActualTypeArguments() {
            return new Type[]{clazz};
        }

        @Override
        public Type getRawType() {
            return List.class;
        }

        @Override
        public Type getOwnerType() {
            return null;
        }
    }


    //把  实体类对象 , List , Map  转 json 字符串

    public static String objTurnJson(Object object){
        return  gson.toJson(object);
    }









    //------------------------  代码测试--------------------------------




    //实体类转 json字符串
    @Test
    public void show1(){
        Javabean  ben=new Javabean();
        ben.setName("abc");
        ben.setAge(22);
        String s = JsonTurnUtils.objTurnJson(ben);
        System.out.println(s);

    }
    
    // list  转 Json 字符串

    @Test
    public void show2(){
        Javabean  ben=new Javabean();
        ben.setName("abc");
        ben.setAge(22);
        Javabean  ben1=new Javabean();
        ben.setName("abc1");
        ben.setAge(221);


        List<Javabean> list=new ArrayList();
        list.add(ben);
        list.add(ben1);
        String s = JsonTurnUtils.objTurnJson(list);
        System.out.println(s);

    }

    // map 转 Json 字符串
    @Test
    public void show3(){

        Map<String,Object> map=new HashMap<>();
        map.put("name","abc");
        map.put("age",123);
        String s = JsonTurnUtils.objTurnJson(map);
        System.out.println(s);

    }

    //json 字符串转 Map
    @Test
    public void show(){
        String str="{\"name\":\"abc2\",\"age\":\"1222231\"}";
        Map<String,Object> stringObjectMap = JsonTurnUtils.jsonTurnMap(str);
        System.out.println(stringObjectMap);
    }


    // 把Json 字符串 转 实体类
    @Test
    public void show23(){
        String str="{\"name\":\"abc2\",\"age\":\"1222231\"}";
        Javabean o = JsonTurnUtils.jsonTurnJavaBena(str, Javabean.class);
        System.out.println(o);
    }



    // 把Json 字符串 转 List
    @Test
    public void sh221ow(){
        String str="[{\"name\":\"abc2\",\"age\":\"1222231\"},{\"name\":\"abc1\",\"age\":\"1231\"}]";

        List<Javabean> list = jsonTurnList(str,Javabean.class);

        for (Object person1 : list) {
            Javabean person11 = (Javabean) person1;
            System.out.println( person11 );
        }

    }


    // Map 和   JavaBean  组合
    @Test
    public void sh1o2w23(){
        String str="{ \"name\":\"abc\",obj:\"{name:abc,age:123}\" }";
        Map<String, Object> stringObjectMap = JsonTurnUtils.jsonTurnMap(str);
        String str1 = (String) stringObjectMap.get("obj");    //obj  的值必须是 字符串 "{name:abc,age:123}"
        Javabean javabean = JsonTurnUtils.jsonTurnJavaBena(str1,Javabean.class);
        System.out.println(javabean);



    }

    // Map 和   List 组合
    @Test
    public void sh1ow23(){

        String str="{ \"name\":\"abc\",\"list\":\"[{\"name\":\"abc\",\"age\":\"123\"}, {\"name\":\"abc1\",\"age\":\"1231\"}  \" }";

        Map<String, Object> stringObjectMap = JsonTurnUtils.jsonTurnMap(str);


        String list =(String)  stringObjectMap.get("list");

        List<Javabean> list1 = jsonTurnList(list,Javabean.class);
        for (Object person1 : list1) {
            System.out.println( person1 );
        }


    }


    //测试类
   private class Javabean implements Serializable {

        private String name;
        private int age;

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "javabean{" +
                    "name='" + name + '\'' +
                    ", age='" + age + '\'' +
                    '}';
        }
    }


}
